/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.eventos.bc;

import java.util.List;
import java.util.Vector;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.cip.esymons.eventos.be.CalificacionModulo;
import org.cip.esymons.eventos.be.Matricula;
import org.cip.esymons.general.be.ConsejoDepartamental;
//import org.cip.esymons.general.util.Utiles;

/**
 *
 * @author Lizardo Rios
 */
@Stateless
public class CalificacionModuloFacade implements CalificacionModuloFacadeLocal {
    @PersistenceContext
    private EntityManager em;

    public void create(CalificacionModulo calificacion) {
        em.persist(calificacion);
    }

    public void edit(CalificacionModulo calificacion) {
        em.merge(calificacion);
    }

    public void remove(CalificacionModulo calificacion) {
        em.remove(em.merge(calificacion));
    }

    public CalificacionModulo find(Object id) {
        return em.find(CalificacionModulo.class, id);
    }

    public List<CalificacionModulo> findAll() {
        return em.createQuery("select object(o) from CalificacionModulo as o").getResultList();
    }

    public List<CalificacionModuloAdapter> listarNotas(Integer codCurso, Integer codModulo) {
        String sql = "select new org.cip.esymons.eventos.bc.CalificacionModuloAdapter(c.calCodigo, a.perapellidoPaterno, a.perapellidoMaterno, a.perNombres, c.nota1, c.nota2, c.nota3 FROM Matricula m LEFT JOIN CalificacionModulo c.matCodigo JOIN m.preCodigo p JOIN p.perCodigo a WHERE p.eveCodigo = ?1 OR c.modCodigo.modcodigo = ?2";
        //try {
            return em.createQuery(sql).getResultList();
        //} catch (Exception e) {
        //    System.out.print("ERROR: " + e.getMessage());
        //    return null;
        //}
    }

    public List<CalificacionModulo> listarCalificaciones(Integer codModulo) {
        return em.createQuery("select c from CalificacionModulo c where c.modCodigo.modCodigo = ?1")
                .setParameter(1, codModulo)
                .getResultList();
    }

    public List<CalificacionModulo> listarCalificaciones(Integer codCurso, Integer codModulo) {
        ConsejoDepartamental cons = (ConsejoDepartamental)em.createQuery("select cd from ConsejoDepartamental cd where cd.cdeEstado=true and cd.cdeActivo=true").getSingleResult();
        List<CalificacionModulo> lista = em.createQuery("select c from CalificacionModulo c where c.matCodigo.matCodigo in (select m.matCodigo from Matricula m join m.preinscripcionEvento p where p.pinTipo = true and p.pinEsPreinscripcion = true and m.matEstado = 1 and p.evento.eveCodigo = ?1) and c.modCodigo.modCodigo = ?2")
                .setParameter(1, codCurso)
                .setParameter(2, codModulo)
                .getResultList();
        for (int i=0; i<lista.size(); i++) {
            lista.get(i).setConsejo(cons);
        }
        return lista;
    }
        
    public List<Matricula> listarMatriculasACalificar(Integer codCurso, Integer codModulo) {
        return em.createQuery("select m from Matricula m join m.preinscripcionEvento p where m.matCodigo not in (select c.matCodigo.matCodigo from CalificacionModulo c where c.matCodigo.matCodigo in (select m1.matCodigo from Matricula m1 join m1.preinscripcionEvento p1 where p1.pinTipo = true and p1.pinEsPreinscripcion = true and m1.matEstado = 1 and p.evento.eveCodigo = ?1) and c.modCodigo.modCodigo = ?2) and p.pinTipo = true and p.pinEsPreinscripcion = true and m.matEstado = 1 and p.evento.eveCodigo = ?1")
                .setParameter(1, codCurso)
                .setParameter(2, codModulo)
                .getResultList();
    }

    public List<CalificacionModulo> listarAprobados(Integer codCurso, Integer codModulo) {
        return em.createQuery("select cal from CalificacionModulo cal where cal.modCodigo.modCodigo = ?2 and cal.calPromedio >= (select cur.curNotaMinima from Curso cur where cur.eveCodigo = ?1)")
                .setParameter(1, codCurso)
                .setParameter(2, codModulo)
                .getResultList();
    }

    public Double calcularPromedioCurso(Integer curCodigo, long matCodigo) {
        try {
            return (Double) em.createQuery("select avg(c.calPromedio) from CalificacionModulo c where c.modCodigo.modCodigo in (select mc.modCodigo from ModuloCurso mc where mc.curCodigo.eveCodigo = ?1) and c.matCodigo.matCodigo = ?2")
                    .setParameter(1, curCodigo)
                    .setParameter(2, matCodigo)
                    .getSingleResult();
        } catch (Exception ex) {
            System.out.println("ERROR: " + ex.getMessage());
            return new Double(0);
        }
    }

    public double calcularPromedioCurso_X_Alumno(Integer curCodigo, long matCodigo) {
        double retorno = 0;
        try {
            Vector v = new Vector();
            v = (Vector) em.createNativeQuery("call sp_promedio_notas_x_alumno (?,?)")
                    .setParameter(1, curCodigo)
                    .setParameter(2, matCodigo)
                    .getSingleResult();
            System.out.println(" elemento 0 " + v.get(0).toString());
            if (v.size() > 0) {
                //BigDecimal bdPromedio = (BigDecimal) ((Vector) v.elementAt(0)).get(0);
                Double bdPromedio  = ((Double) (((Vector) (v.elementAt(0))).get(0))).doubleValue();
                //double ret = Double.valueOf(bdPromedio);
                System.out.println("promedio: " + bdPromedio);
                //retorno = Utiles.aReal(ret);
                retorno = bdPromedio;
            }
        } catch (Exception ex) {
            System.out.println("ERROR: " + ex.getMessage());
        }
        return retorno;
    }

}
